https://leetcode.cn/problems/find-k-closest-elements/submissions/560519533/

class Solution {
public:
    vector<int> findClosestElements(vector<int>& arr, int k, int x) {
        int l, r;  // 用于标记左右指针
        vector<int> ans;  // 用于存储结果

        // 如果x小于等于数组的第一个元素，则直接返回前k个元素
        if (x <= arr[0]) {
            ans.assign(arr.begin(), arr.begin() + k);
            return ans;
        }
        // 如果x大于等于数组的最后一个元素，则直接返回最后k个元素
        if (x >= arr[arr.size() - 1]) {
            ans.assign(arr.end() - k, arr.end());
            return ans;
        }

        // 找到x在数组中的位置，并初始化左右指针
        for (int i = 0; i < arr.size() - 1; i++) {
            if (arr[i] <= x && arr[i + 1] >= x) {
                // 比较x与arr[i]和arr[i+1]的距离，选择距离更近的那个
                if (abs(x - arr[i]) <= abs(x - arr[i + 1])) {
                    ans.push_back(arr[i]);
                    l = i - 1;
                    r = i + 1;
                } else {
                    ans.push_back(arr[i + 1]);
                    l = i;
                    r = i + 2;
                }
                k--;  // 已经找到一个最接近的元素
                break;
            }
        }

        // 从左右两侧继续选择最接近x的元素
        while (k > 0) {
            // 比较左侧元素和右侧元素与x的距离，选择更近的那个
            if (l >= 0 && (r >= arr.size() || abs(x - arr[l]) <= abs(x - arr[r]))) {
                ans.push_back(arr[l]);
                l--;
                k--;
            } else {
                ans.push_back(arr[r]);
                r++;
                k--;
            }

            // 如果左指针越界，剩下的所有元素都从右指针开始添加
            if (l < 0) {
                for (int j = 0; j < k; j++) {
                    ans.push_back(arr[r]);
                    r++;
                }
                break;
            }
            // 如果右指针越界，剩下的所有元素都从左指针开始添加
            if (r > arr.size() - 1) {
                for (int m = 0; m < k; m++) {
                    ans.push_back(arr[l]);
                    l--;
                }
                break;
            }
        }

        // 对结果进行排序
        sort(ans.begin(), ans.end());

        return ans;
    }
};